__kernel void openCLkernel(__global float* foil,
                           int tempCounter,
                           __global const int *X,
                           __global const int *Y,
                           __global const float *T,
                           int N,
                           int k){

    int col = get_global_id(0);
    int row = get_global_id(1);

    float tempResult;
    int tempX, tempY;
    float tempValue;
    float tempSum;
    float neighborhood; /*Cada casillero tiene como mucho 5 vecinos*/
    int tempIndex;
    int i = 0;

    /*Seteo las fuentes de calor*/
    tempIndex = row * N + col;
    if (tempIndex < tempCounter){/*tempCounter=0 implica que no hay fuentes*/
        tempX = X[tempIndex];
        tempY = Y[tempIndex];
        tempValue = T[tempIndex];
        foil[tempX + tempY * N] = tempValue;
    }

    barrier(CLK_GLOBAL_MEM_FENCE);/*Espero a que se reseteen todas las fuentes*/

    while(i<k){
        tempSum = tempSum = foil[row * N + col];
        neighborhood = 5;
        /*Se fija si hay un superior*/
        if(row==0){
            neighborhood=neighborhood-1.0;
        }else{
            tempSum = tempSum+foil[(row - 1) * N + col];
        }

        /*Se fija si hay un inferior*/
        if(row==N-1){
            neighborhood=neighborhood-1.0;
        }else{
            tempSum = tempSum+foil[(row + 1) * N + col];
        }

        /*Se fija si hay un vecino a la izquierda*/
        if(col==0){
            neighborhood=neighborhood-1.0;
        }else{
            tempSum += foil[row * N + col - 1];
        }

        /*Se fija si hay un vecino a la derecha*/
        if(col==N-1){
            neighborhood=neighborhood-1.0;
        }else{
            tempSum = tempSum+foil[row * N + col + 1];
        }

        tempResult = tempSum/neighborhood;
        barrier(CLK_GLOBAL_MEM_FENCE);/*Espero a que se reseteen todas las fuentes*/

        foil[col + row * N] = tempResult;/*Escribo en la misma matriz de lectura*/
        barrier(CLK_GLOBAL_MEM_FENCE);/*Espero a que se reseteen todas las fuentes*/

        /*Reseteo las fuentes de calor*/
        tempIndex = row * N + col;
        if (tempIndex < tempCounter){/*tempCounter=0 implica que no hay fuentes*/
            tempX = X[tempIndex];
            tempY = Y[tempIndex];
            tempValue = T[tempIndex];
            foil[tempX + tempY * N] = tempValue;
        }

        barrier(CLK_GLOBAL_MEM_FENCE);/*Espero a que se reseteen todas las fuentes*/
        
        i++;
    }
}
